package com.tyae.managedBean;

import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.event.DateSelectEvent;
import org.primefaces.event.ScheduleEntryMoveEvent;
import org.primefaces.event.ScheduleEntrySelectEvent;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;

import com.tyae.bean.Advogado;
import com.tyae.bean.Empresa;
import com.tyae.bean.Agenda;
import com.tyae.bean.Usuario;
import com.tyae.validador.GeraMensagem;
import com.tyae.validador.ValidadorFactory;
import com.tyae.validador.Validar;
import com.tyae.dao.DAOFactory;

@ManagedBean
@SessionScoped
public class ControleAgenda implements Serializable{

	private static final long serialVersionUID = 3231096585790205081L;
	private Agenda agenda;
	private String mensagem;
	private List<Agenda> lista;  
	private String textoPesquisa = "";
	private String retorno = "cadastro";
    private Empresa empresa;
    private List<Advogado> advogados;
    private Advogado advogado;
    private Advogado advogadoSelecione;
    private ScheduleEvent event = new DefaultScheduleEvent();
    private ScheduleModel eventModel;
    private ScheduleModel lazyEventModel;
    
	public ControleAgenda(){
		create();
	}

	public void create(){
		agenda = new Agenda();
	}

	public Agenda getAgenda() {
		if (agenda == null){
			create();
		}
		return agenda;
	}

	public void setAgenda(Agenda agenda) {
		this.agenda = agenda;
	}

	public String alterar(){
		return "cadastro";
	}

	public String adicionar(){
		create();
		return "cadastro";
	}

	public void pesquisar(){
		setLista(DAOFactory.getAgendaDAO().getSelecionar(textoPesquisa, getEmpresa().getCodigoEmpresa()));
	}

	public void onEventSelect(ScheduleEntrySelectEvent selectEvent) {  
		event = selectEvent.getScheduleEvent();  
	} 
	public void onDateSelect(DateSelectEvent selectEvent) {  
		event = new DefaultScheduleEvent("",selectEvent.getDate(),selectEvent.getDate());
	} 
	public void onEventMove(ScheduleEntryMoveEvent event) {  
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Evento Movido", "Dia:" + event.getDayDelta());  
	    addMessage(message);  
	} 
	 private void addMessage(FacesMessage message) {  
		FacesContext.getCurrentInstance().addMessage(null, message);  
	}

	public void addEvent(ActionEvent actionEvent) {
		if (event.getId() == null)
			eventModel.addEvent(event);
		else
			eventModel.updateEvent(event);

		for (ScheduleEvent ev : eventModel.getEvents()){

			agenda = new Agenda();
			agenda.setEmpresa(getEmpresa());
			agenda.setObservacao(ev.getTitle());
			agenda.setAdvogado(advogado);
			agenda.setData(ev.getStartDate());
			agenda.setChave(ev.getId());
			try {
				DAOFactory.getAgendaDAO().excluir(advogado, ev.getStartDate());
				if (!ev.getTitle().isEmpty()){
					gravar();
				}
			} catch (Exception e) {
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Erro ao gravar. \n"+e.getMessage(), ""));
			}
		}
		
		event = new DefaultScheduleEvent();
	}
	
	public void lerEventos(){
		lista = DAOFactory.getAgendaDAO().getSelecionar(advogado.getPessoa().getNome(), empresa.getCodigoEmpresa());
		eventModel = null;
		for (Agenda ag : lista) {
			getEventModel().addEvent(new DefaultScheduleEvent(ag.getObservacao(),ag.getData(),ag.getData())); 
		}			
	}
	
	public void gravar(){
		
		for (Agenda ag : lista) {
			if (ag.getChave().equals(agenda.getChave())){
				agenda.setCodigoAgenda(ag.getCodigoAgenda());
			}
		}
		
		Validar validador = ValidadorFactory.getValidador();
		validador.validar(agenda);
		String[] mensagens = validador.getMensagensValidacao();
		mensagem = GeraMensagem.getMensagem(mensagens);
		setMensagem(mensagem);		
		if (validador.isOk() && mensagem.isEmpty() ){		
 			if (getAgenda().getCodigoAgenda() == 0){
				try {
					agenda.setEmpresa(getEmpresa());
					DAOFactory.getAgendaDAO().inserir(agenda);
					lista.add(agenda);
				} catch (Exception e) {
					setMensagem("erro: "+e.getMessage());
					FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,getMensagem(), ""));
				}
			}else{
				try {
					DAOFactory.getAgendaDAO().alterar(agenda);
				} catch (Exception e) {
					setMensagem("erro: "+e.getMessage());
					FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,getMensagem(), ""));
				}
			}
		}else{
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,getMensagem(), ""));
		}
		
		lista = DAOFactory.getAgendaDAO().getSelecionar(advogado.getPessoa().getNome(), empresa.getCodigoEmpresa());
		
	}

	public void excluir(){
		try {
			DAOFactory.getAgendaDAO().excluir(agenda);
		} catch (Exception e) {
			setMensagem(e.getMessage());
		}
		pesquisar();
	}

	public void limpar(){
		if (getAgenda().getCodigoAgenda() == 0){
			create();
			textoPesquisa = "";
		}
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public List<Agenda> getLista() {
		return lista;
	}

	public void setLista(List<Agenda> lista) {
		this.lista = lista;
	}

	public String getTextoPesquisa() {
		return textoPesquisa;
	}

	public void setTextoPesquisa(String textoPesquisa) {
		this.textoPesquisa = textoPesquisa;
	}

	public String getRetorno() {
		return retorno;
	}

	public void setRetorno(String retorno) {
		this.retorno = retorno;
	}

	public Empresa getEmpresa() {
		if (empresa == null){
			HttpSession session = null;	
			session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true );  
			Usuario usuario = (Usuario) session.getAttribute( "usr" ); 		
			empresa = usuario.getEmpresa();
		}
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public List<Advogado> getAdvogados() {
		if (advogados == null){
			advogados = DAOFactory.getAdvogadoDAO().getSelecionar("", getEmpresa().getCodigoEmpresa());
		}		
		return advogados;
	}

	public void setAdvogados(List<Advogado> advogados) {
		this.advogados = advogados;
	}

	public Advogado getAdvogadoSelecione() {
		if (advogadoSelecione == null){
			advogadoSelecione = new Advogado();
		}		
		return advogadoSelecione;
	}

	public void setAdvogadoSelecione(Advogado advogadoSelecione) {
		this.advogadoSelecione = advogadoSelecione;
	}

	public ScheduleEvent getEvent() {
		return event;
	}

	public void setEvent(ScheduleEvent event) {
		this.event = event;
	}

	public ScheduleModel getEventModel() {
		if (eventModel == null){
			eventModel = new DefaultScheduleModel();  
		}
		return eventModel;
	}

	public void setEventModel(ScheduleModel eventModel) {
		this.eventModel = eventModel;
	}

	public Advogado getAdvogado() {
		return advogado;
	}

	public void setAdvogado(Advogado advogado) {
		this.advogado = advogado;
	}

	public ScheduleModel getLazyEventModel() {
		return lazyEventModel;
	}

	public void setLazyEventModel(ScheduleModel lazyEventModel) {
		this.lazyEventModel = lazyEventModel;
	}

}